//
// Created by Administrator on 2025/4/12.
//

#ifndef STATEMACHINE_STATEMACHINE_H
#define STATEMACHINE_STATEMACHINE_H

#include <iostream>
#include "BaseState.h"

/*
 * 把这个想象为一个受你把控的机器，机器有不同的朝向（东，南，西，北），这就是不同的状态
 * 当你发出指令的时候，机器就有不同的动作
 * 如果说发生了错误，那么机器就罢工了......
 * */

//定义错误回调
using ErrorHandler = void(*)(int errID,std::string errMsg);

//状态机类
class StateMachine{
public:
    StateMachine();
    ~StateMachine();
    //初始化状态机,这个要有正常状态和错误状态
    bool initStateMachine(BaseState* initialState,BaseState* errorState);
    //核心！！！！！！
    //处理事件，注意区别与 BaseState 中的函数
    //这里是捕获到某个事件，由状态机调用 BaseState 中的handleEvent方法
    //BaseState作为父类即可通过虚函数表调用子类，进行逻辑处理
    bool handleEvent(const Event* event);
    //切换状态
    bool changeState(BaseState* newState);
    //回到前一个状态
    bool transitionToPreState();
    //设置错误处理器
    void setErrorHandler(ErrorHandler errorHandler);
    //触发错误处理
    void handleError(int errID,std::string errMsg);
    //获取当前状态
    BaseState* getCurrentState() const;
private:
    BaseState* _preState;//存储上一个状态，如果不需要回到上一个状态可以不写
    BaseState* _curState;//存储当前状态
    BaseState* _errState;//错误状态，如果不需要可以不写
    ErrorHandler _errorHandler;//定义错误处理方法，如果不需要可以不写
    bool _transitionInProgress;//用来标志一个事件是否被"使用"
};


#endif //STATEMACHINE_STATEMACHINE_H
